<?php

namespace framework\support;

use framework\libraries\Stdio;

class MiddleWare
{
    private static $_instance;
    private static $config;
    /**
     * Single constructor. 私有的构造方法
     */
    private function __construct()
    {;
    }

    /**
     * @purpose: 创建__clone方法防止对象被复制克隆
     */
    private function __clone()
    {
        // E_USER_ERROR只能通过trigger_error($msg, E_USER_ERROR)手动触发。
        // E_USER_ERROR是用户自定义错误类型，可以被set_error_handler错误处理函数捕获，允许程序继续运行。
        // E_ERROR是系统错误，不能被set_error_handler错误处理函数捕获，程序会退出运行
        trigger_error('Clone is not allow!', E_USER_ERROR);
    }


    /**
     * @return Single|Object 单例方法,用于访问实例的公共的静态方法
     */
    public static function getInstance()
    {
        if (!self::$_instance) {
            self::$_instance = new self();
            $configFile = BasePath . "/app/config/middleware.php";
            if (file_exists($configFile)) {
                self::$config = require($configFile);
            }
        }
        return self::$_instance;
    }
    /**
     * 读取中间件进行处理
     */
    public static function before($route)
    {

        foreach (self::$config as $key => $value) {

            if ($key == $route || $key == '') {
                if (is_array($value)) {
                    foreach ($value as $item) {
                        $file = BasePath . '/app/middleware/' . $item . '.php';
                        if (file_exists($file)) {
                            require_once $file;
                            $namespace = "app\\middleware\\";
                            $fullClassName = $namespace . $item;
                            if (class_exists($fullClassName)) {
                                $class = new $fullClassName();
                                if (method_exists($class, 'before')) {
                                    return $class->before();
                                }
                            } else {
                                Stdio::error("类 {$fullClassName} 不存在");
                            }
                        } else {
                            Stdio::error("中间件不存在 {$file}");
                        }
                    }
                }
            }
        }
    }

    /**
     * 读取中间件进行处理
     */
    public static function after($route)
    {
        //将 $config 数组反转
        $afterList = array_reverse(self::$config);
        foreach ($afterList as $key => $value) {
            if ($key == $route || $key == '') {
                if (is_array($value)) {
                    foreach ($value as $item) {
                        $file = BasePath . '/app/middleware/' . $item . '.php';
                        if (file_exists($file)) {
                            require_once $file;
                            $namespace = "app\\middleware\\";
                            $fullClassName = $namespace . $item;
                            if (class_exists($fullClassName)) {
                                $class = new $fullClassName();
                                if (method_exists($class, 'after')) {
                                    return $class->after();
                                }
                            } else {
                                Stdio::error("类 {$fullClassName} 不存在");
                            }
                        } else {
                            Stdio::error("中间件不存在 {$file}");
                        }
                    }
                }
            }
        }
    }
}
